/*************************************************************
 * Title: 
 * Description: 
 * Author: Snow Huang
 * Email: Shaobin.Software@gmail.com Shaobin_Software@163.com
 * CreateTime: 2010-8-3 上午08:02:24
 * Copyright © 落羽社区 All right reserved
 ************************************************************/
package snow.core.domain.enums.type;

import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;

/**
 * 
 */
public abstract class EnumUserType implements UserType {

	/** 从二级缓存中取这个对象数据时要调用的方法 */
	public Object assemble(Serializable cached, Object owner) throws HibernateException {
		return cached;
	}

	/** 这是用于Hibernate缓存生成的快照，由于枚举类型对象是不可变的，直接返回就好了。 */
	public Object deepCopy(Object value) throws HibernateException {
		return value;
	}

	/** hibernate把这个数据放入二级缓存时要调用的方法 */
	public Serializable disassemble(Object value) throws HibernateException {
		return (Serializable) value;
	}

	public boolean equals(Object x, Object y) throws HibernateException {
		return x == y;
	}

	public int hashCode(Object x) throws HibernateException {
		return x.hashCode();
	}

	/** 告诉hibernate这个类型是不可变的。有微小的性能优化 */
	public boolean isMutable() {
		return false;
	}

	/** 从JDBC的ResultSet读取属性值。这个方法是在从数据库查询数据时用到。 */
	public abstract Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException;

	/** 将属性的值设置到PreparedStatement。 */
	public abstract void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException;

	/** 处理脱管对象状态的合并。 */
	public Object replace(Object original, Object target, Object owner) throws HibernateException {
		return original;
	}

	/** 告诉Hibernate这个UserType用来映射的数据类型。 */
	public abstract Class<?> returnedClass();

	/** 告诉Hibernate要使用什么SQL列类型生成DDL */
	public abstract int[] sqlTypes();
}
